import { ref } from 'vue'
import { defineStore } from 'pinia'
import type { User, tokenInfo } from '@/typedefined/User';
import { userApi } from '@/request';
import { BusinessException } from '@/exception/BusinessException';
import { ParameterException } from '@/exception/ParameterException';
import { removeToken, setToken } from '@/utils/tokenUtils';

/**
 * @description 用户信息状态管理
 */
export const useUserStore = defineStore('user', () => {

    const init:User = {
        nickname: "", // 昵称
        gander: 0, // 性别（0代表男，1代表女）
        avatar: "", // 头像地址
        introduce: "", // 个人简介
        createdTime: new Date(), // 创建时间
        roleNameList: [], // 角色名称列表
        permissionList: [] // 权限名称列表
    }

    // 用户信息
    const userInfo = ref<User>({
        nickname: "", // 昵称
        gander: 0, // 性别（0代表男，1代表女）
        avatar: "", // 头像地址
        introduce: "", // 个人简介
        createdTime: new Date(), // 创建时间
        roleNameList: [], // 角色名称列表
        permissionList: [] // 权限名称列表
    });

    /**
     * @description 获取用户信息
     */
    function getUserInfo():User{
        return userInfo.value;
    }

    /**
     * @description 本地更新用户信息
     */
    function updateUserInfo(user:User) {
        if(!user) throw new ParameterException("没有做任何更新");
        userInfo.value = {
            ...userInfo.value,
            ...user
        };
    }

    /**
     * @description 请求后端更新用户信息
     */
    async function requestUpdateUserInfo(user:User){
        await userApi.updateUserInfo(user);
        updateUserInfo(user);
    }
    
    /**
     * @description 从后端获取用户信息
     */
    async function requestToGetUserInfo(){
        const user = await userApi.getUserInfo() as unknown as User;
        updateUserInfo(user);
    }

    /**
     * @description 用户登录
     */
    async function userLogin(code:string){
        if(!/^\d{4}$/.test(code)) throw new ParameterException("验证码错误");
        // 调用登录接口
        const data:tokenInfo = await userApi.userLogin(code) as unknown as tokenInfo;
        setToken(data);
        // 获取用户信息
        await requestToGetUserInfo();
    }

    /**
     * @description 退出登录
     */
    async function userLogout(){
        await userApi.userLogout();
        // 重置用户信息
        updateUserInfo(init);
        // 删除token
        removeToken();
    }

    /**
     * @description 上传头像
     */
    async function uploadAvatar(file:File):Promise<string> {
        if(!file) throw new ParameterException("未选择任何文件");
        // 调用上传头像的接口，获取用户url头像
        const avatarUrl = await userApi.uploadAvatar(file);
        // 调用接口，上报 url
        const success = await userApi.updateAvatar(avatarUrl);
        if(!success) throw new BusinessException("图片上传失败");
        return avatarUrl;
    }


    return {
        getUserInfo,requestToGetUserInfo,userLogin,userLogout,uploadAvatar,userInfo,requestUpdateUserInfo
    }
    
});
